CREATE DATABASE BD_SisVenda;
go

ALTER DATABASE BD_SisVenda 
SET ALLOW_SNAPSHOT_ISOLATION ON 
ALTER DATABASE BD_SisVenda 
SET READ_COMMITTED_SNAPSHOT ON

CREATE TABLE Uf (
  UfNome VARCHAR(2)  NOT NULL    ,
PRIMARY KEY(UfNome));
GO




CREATE TABLE TipoTelefone (
  IdTipoTelefone INTEGER  NOT NULL   IDENTITY ,
  Descricao VARCHAR(40)      ,
PRIMARY KEY(IdTipoTelefone));
GO




CREATE TABLE Situacao (
  IdSituacao INTEGER  NOT NULL   IDENTITY ,
  Descricao VARCHAR(50)  NOT NULL    ,
PRIMARY KEY(IdSituacao));
GO




CREATE TABLE Cargo (
  IdCargo INTEGER  NOT NULL   IDENTITY ,
  Descricao VARCHAR(45)    ,
  SalarioBase DECIMAL(11,2)    ,
  CargaHoraria INT      ,
PRIMARY KEY(IdCargo));
GO




CREATE TABLE CategoriaProduto (
  IdCategoriaProduto INTEGER  NOT NULL   IDENTITY ,
  Descricao VARCHAR(45)  NOT NULL  ,
  Comissao DECIMAL(11,2)  NOT NULL    ,
PRIMARY KEY(IdCategoriaProduto));
GO




CREATE TABLE CategoriaVenda (
  IdCategoriaVenda INTEGER  NOT NULL   IDENTITY ,
  Descricao VARCHAR(45)  NOT NULL    ,
PRIMARY KEY(IdCategoriaVenda));
GO




CREATE TABLE Produto (
  IdProduto INTEGER  NOT NULL   IDENTITY ,
  CategoriaProduto_IdCategoriaProduto INTEGER  NOT NULL  ,
  Descricao VARCHAR(45)  NOT NULL  ,
  Preco DECIMAL(11,2)  NOT NULL  ,
  Estoque INT    ,
  Unidade VARCHAR(3)  NOT NULL  ,
  EstoqueMinimo INT  NOT NULL  ,
  CodigoFabricante VARCHAR(20)    ,
  Apelido VARCHAR(45)      ,
PRIMARY KEY(IdProduto)  ,
  FOREIGN KEY(CategoriaProduto_IdCategoriaProduto)
    REFERENCES CategoriaProduto(IdCategoriaProduto));
GO

CREATE INDEX IFK_proCatPro ON Produto (CategoriaProduto_IdCategoriaProduto);
GO


CREATE TABLE Cidade (
  IdCidade INTEGER  NOT NULL   IDENTITY ,
  Uf_UfNome VARCHAR(2)  NOT NULL  ,
  Cidade VARCHAR(45)      ,
PRIMARY KEY(IdCidade)  ,
  FOREIGN KEY(Uf_UfNome)
    REFERENCES Uf(UfNome));
GO

CREATE INDEX IFK_cidUf ON Cidade (Uf_UfNome);
GO

CREATE TABLE Endereco (
  IdEndereco INTEGER  NOT NULL   IDENTITY ,
  Cidade_IdCidade INTEGER  NOT NULL  ,
  Rua VARCHAR(45)    ,
  Numero INT    ,
  Bairro VARCHAR(45)    ,
  Cep VARCHAR(10)    ,
  Descricao VARCHAR(45)      ,
PRIMARY KEY(IdEndereco)  ,
  FOREIGN KEY(Cidade_IdCidade)
    REFERENCES Cidade(IdCidade));
GO

CREATE INDEX IFK_endCid ON Endereco (Cidade_IdCidade);
GO

CREATE TABLE Pessoa (
  IdPessoa INTEGER  NOT NULL   IDENTITY ,
  Endereco_IdEndereco INTEGER  NOT NULL  ,
  TipoTelefone_IdTipoTelefone INTEGER  NOT NULL  ,
  Nome VARCHAR(80)    ,
  CPF VARCHAR(12)    ,
  RG VARCHAR(20)    ,
  CNPJ VARCHAR(14)    ,
  InscricaoEstadual VARCHAR(20)    ,
  Sexo CHAR(1)    ,
  DataNascimento DATE    ,
  TipoPessoa CHAR(1)    ,
  EstadoCivil VARCHAR(30)    ,
  Telefone VARCHAR(13)    ,
  Celular VARCHAR(13)    ,
  Fax VARCHAR(13)    ,
  Email VARCHAR(100)      ,
PRIMARY KEY(IdPessoa)    ,
  FOREIGN KEY(Endereco_IdEndereco)
    REFERENCES Endereco(IdEndereco),
  FOREIGN KEY(TipoTelefone_IdTipoTelefone)
    REFERENCES TipoTelefone(IdTipoTelefone));
GO

CREATE INDEX IFK_pesEnd ON Pessoa (Endereco_IdEndereco);
GO
CREATE INDEX IFK_pesTte ON Pessoa (TipoTelefone_IdTipoTelefone);
GO


CREATE TABLE Funcionario (
  Pessoa_IdPessoa INTEGER  NOT NULL  ,
  Cargo_IdCargo INTEGER  NOT NULL  ,
  Situacao_IdSituacao INTEGER  NOT NULL    ,
PRIMARY KEY(Pessoa_IdPessoa)      ,
  FOREIGN KEY(Situacao_IdSituacao)
    REFERENCES Situacao(IdSituacao),
  FOREIGN KEY(Cargo_IdCargo)
    REFERENCES Cargo(IdCargo),
  FOREIGN KEY(Pessoa_IdPessoa)
    REFERENCES Pessoa(IdPessoa));
GO

CREATE INDEX IFK_sitFun ON Funcionario (Situacao_IdSituacao);
GO
CREATE INDEX IFK_funCar ON Funcionario (Cargo_IdCargo);
GO
CREATE INDEX IFK_pesFun ON Funcionario (Pessoa_IdPessoa);
GO


CREATE TABLE Referencia (
  IdReferencia INTEGER  NOT NULL   IDENTITY ,
  Pessoa_IdPessoa INTEGER  NOT NULL  ,
  Descricao VARCHAR(100)    ,
  Telefone VARCHAR(13)      ,
PRIMARY KEY(IdReferencia)  ,
  FOREIGN KEY(Pessoa_IdPessoa)
    REFERENCES Pessoa(IdPessoa));
Go

CREATE INDEX IFK_pesRef ON Referencia (Pessoa_IdPessoa);
GO


CREATE TABLE Cliente (
  Pessoa_IdPessoa INTEGER  NOT NULL    ,
PRIMARY KEY(Pessoa_IdPessoa)  ,
  FOREIGN KEY(Pessoa_IdPessoa)
    REFERENCES Pessoa(IdPessoa));
GO

CREATE INDEX IFK_pesCli ON Cliente (Pessoa_IdPessoa);
GO

CREATE TABLE Fornecedor (
  Pessoa_IdPessoa INTEGER  NOT NULL    ,
PRIMARY KEY(Pessoa_IdPessoa)  ,
  FOREIGN KEY(Pessoa_IdPessoa)
    REFERENCES Pessoa(IdPessoa));
GO

CREATE INDEX IFK_pesFor ON Fornecedor (Pessoa_IdPessoa);
GO


CREATE TABLE ProdutoFornecedor (
  Produto_IdProduto INTEGER  NOT NULL  ,
  Fornecedor_Pessoa_IdPessoa INTEGER  NOT NULL  ,
  DataProdutoFornecedor DATE      ,
PRIMARY KEY(Produto_IdProduto, Fornecedor_Pessoa_IdPessoa)    ,
  FOREIGN KEY(Fornecedor_Pessoa_IdPessoa)
    REFERENCES Fornecedor(Pessoa_IdPessoa),
  FOREIGN KEY(Produto_IdProduto)
    REFERENCES Produto(IdProduto));
GO

CREATE INDEX IFK_forProFor ON ProdutoFornecedor (Fornecedor_Pessoa_IdPessoa);
GO
CREATE INDEX IFK_proIca ON ProdutoFornecedor (Produto_IdProduto);
GO


CREATE TABLE Venda (
  IdVenda INTEGER  NOT NULL   IDENTITY ,
  Funcionario_Pessoa_IdPessoa INTEGER  NOT NULL  ,
  CategoriaVenda_IdCategoriaVenda INTEGER  NOT NULL  ,
  Cliente_Pessoa_IdPessoa INTEGER  NOT NULL  ,
  DataVenda DATE    ,
  ValorTotal DECIMAL(11,2)    ,
  Situacao VARCHAR(20)    ,
  TotalComissao DECIMAL(11,2)      ,
PRIMARY KEY(IdVenda)      ,
  FOREIGN KEY(Funcionario_Pessoa_IdPessoa)
    REFERENCES Funcionario(Pessoa_IdPessoa),
  FOREIGN KEY(Cliente_Pessoa_IdPessoa)
    REFERENCES Cliente(Pessoa_IdPessoa),
  FOREIGN KEY(CategoriaVenda_IdCategoriaVenda)
    REFERENCES CategoriaVenda(IdCategoriaVenda));
GO

CREATE INDEX IFK_funPed ON Venda (Funcionario_Pessoa_IdPessoa);
GO
CREATE INDEX IFK_venCli ON Venda (Cliente_Pessoa_IdPessoa);
GO
CREATE INDEX IFK_venCatVenda ON Venda (CategoriaVenda_IdCategoriaVenda);
GO

CREATE TABLE Parcela (
  IdParcela INTEGER  NOT NULL   IDENTITY ,
  Venda_IdVenda INTEGER  NOT NULL  ,
  NumeroParcela INT  NOT NULL  ,
  ValorParcela DECIMAL(11,2)  NOT NULL  ,
  DataVencimento DATE  NOT NULL  ,
  DataEfetivaPagamento DATE    ,
  ValorComissao DECIMAL(11,2)    ,
  SituacaoComissao VARCHAR(20)    ,
  SituacaoParcela VARCHAR(20)    ,
  ValorPagoParcela DECIMAL(11,2)      ,
PRIMARY KEY(IdParcela)  ,
  FOREIGN KEY(Venda_IdVenda)
    REFERENCES Venda(IdVenda));
GO

CREATE INDEX IFK_venPar ON Parcela (Venda_IdVenda);
GO


CREATE TABLE Compra (
  IdCompra INTEGER  NOT NULL   IDENTITY ,
  Fornecedor_Pessoa_IdPessoa INTEGER  NOT NULL  ,
  NumeroPedidoNotaFiscal INTEGER    ,
  DataCompra DATE      ,
PRIMARY KEY(IdCompra)  ,
  FOREIGN KEY(Fornecedor_Pessoa_IdPessoa)
    REFERENCES Fornecedor(Pessoa_IdPessoa));
GO

CREATE INDEX IFK_forCon ON Compra (Fornecedor_Pessoa_IdPessoa);
GO


CREATE TABLE ItemCompra (
  Produto_IdProduto INTEGER  NOT NULL  ,
  Compra_IdCompra INTEGER  NOT NULL  ,
  Quantidade INTEGER    ,
  Preco DECIMAL(11,2)      ,
PRIMARY KEY(Produto_IdProduto, Compra_IdCompra)    ,
  FOREIGN KEY(Compra_IdCompra)
    REFERENCES Compra(IdCompra),
  FOREIGN KEY(Produto_IdProduto)
    REFERENCES Produto(IdProduto));
GO

CREATE INDEX IFK_comIteCom ON ItemCompra (Compra_IdCompra);
GO
CREATE INDEX IFK_proIteCom ON ItemCompra (Produto_IdProduto);
GO


CREATE TABLE ItemVenda (
  Produto_IdProduto INTEGER  NOT NULL  ,
  Venda_IdVenda INTEGER  NOT NULL  ,
  Quantidade INTEGER  NOT NULL  ,
  Preco DECIMAL(11,2)  NOT NULL  ,
  ValorComissao DECIMAL(11,2)      ,
PRIMARY KEY(Produto_IdProduto, Venda_IdVenda)    ,
  FOREIGN KEY(Produto_IdProduto)
    REFERENCES Produto(IdProduto),
  FOREIGN KEY(Venda_IdVenda)
    REFERENCES Venda(IdVenda));
GO


CREATE INDEX IFK_proIteVen ON ItemVenda (Produto_IdProduto);
GO
CREATE INDEX IFK_venItemPed ON ItemVenda (Venda_IdVenda);
GO


